const express = require('express')
const app = express()

// 设置跨域访问
const cors = require('cors')
app.use(cors())

// multer 中间件用于处理 multipart/form-data 类型的表单数据，用于上传文件
const multer = require("multer")
// 在 server 服务端下新建一个 public 文件，在 public 文件下新建 upload 文件用于存放图片
const upload = multer({ dest: './public/upload' })

app.use(upload.any())
// 静态托管
app.use(express.static("./public"))

// 设置表单解析
const bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())

// 错误中间件挂载 res.cc 函数
app.use((req, res, next) => {
	res.cc = (err, status = 1) => {
		res.send({
			status,
			message: err instanceof Error ? err.message : err
		})
	}
	next()
})

// 导入 expressJWT 中间件 和 密钥配置文件 忽略 /api 路径接口验证 token
const config = require('./jwt_config')
const expressJWT = require('express-jwt')

// 使用 expressJWT 这个中间件，来解析 token
// 除了登录接口以外(/api/xxxx)，其他接口都需要进行身份认证
app.use(expressJWT({ secret: config.secretKey, algorithms: ['HS256'] }).unless({ path: [/^\/api\//] }))

// 挂载登录模块路由
const loginRouter = require('./router/login')
app.use('/api', loginRouter)
// 挂载用户模块路由
const userInfoRouter = require('./router/userinfo')
app.use('/user', userInfoRouter)
// 挂载设置模块路由
const setRouter = require('./router/setting')
app.use('/set', setRouter)
// 挂载产品模块路由
const productRouter = require('./router/product')
app.use('/pro', productRouter)
// 挂载消息模块路由
const messageRouter = require('./router/message')
app.use('/msg', messageRouter)
// 挂载合同文件模块
const fileRouter = require('./router/file')
app.use('/file', fileRouter)
// 挂载登录日志模块
const loginLogRouter = require('./router/login_log')
app.use('/loginLog', loginLogRouter)
// 挂载操作日志模块
const operateLogRouter = require('./router/operate_log')
app.use('/operateLog', operateLogRouter)
// 挂载系统概览模块
const overviewRouter = require('./router/overview')
app.use('/overview', overviewRouter)
// 挂载部门消息模块
const departmentMsgRouter = require('./router/department_msg')
app.use('/departmentMsg', departmentMsgRouter)



// 对不符合 joi 规则 的情况进行报错
const joi = require('joi')

app.use((err, req, res, next) => {
	if (err instanceof joi.ValidationError) {
		return res.cc(err)
	}
	next()
})


app.listen(3007, () => {
	console.log('http:127.0.0.1:3007')
})